package com.itheima.d10_AnLi;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @ClassName Demo1
 * @Author 16799
 * @Date 2025/8/31 9:19
 * @Version 1.0
 * @Description TODO
 *
 *  备注：黑马视频第183集，视频时间是2023.5.17，这是线下班的一份考题，有很多题，每一道题在我看来都很有难度
 *       这次是缝合了一道题的线下讲解视频，讲的真好，题目也好，花钱确实有意义
 *
 *  需求描述：有100份礼品，小红，小明两人同时发送，当剩下的礼品小于10份的时候则不再送出，
 *          利用多线程模拟该过程并将线程的名称打印出来。并最后在控制台分别打印小红，小明各自送出多少分礼物。
 *
 *    还要统计小明小红各自送出礼物个数：
 *  弹幕：说MAP 集合的同学是对的 放在主线程里new 一个MAP结合 在构造函数里传到这里。我是将两个集合和方法放在一个实体类里
 *
 *  疑惑：这个案例磊哥写的有bug
 **/
public class Demo1 {
    public static void main(String[] args) throws Exception{
        // 目标:有100份礼品，小红，小明两人同时发送，当剩下的礼品小于10份的时候则不再送出，
        // 利用多线程模拟该过程并将线程的名称打印出来。并最后在控制台分别打印小红，小明各自送出多少分礼物。
        //1.在程序中准备100份礼物
        List<String> gift = new ArrayList<>();
        String[] names = {"口红","包包","鲜花","剃须刀","皮带","手表"};
        Random r = new Random();
        for (int i = 0; i < 100; i++) {
            //在数组中随机取一个礼物，并且带上编号，方便记录是第几个礼物，放在gift集合中
/*            int index = r.nextInt(names.length);
            gift.add(names[index]+(i+1));
            可以一步到位
            */
            gift.add(names[r.nextInt(names.length)] + (i+1));
        }
        System.out.println(gift);

        //定义线程类，创建线程对象去gift集合中拿礼物
/*        new SendThread(gift,"小明").start();
        new SendThread(gift,"小红").start();*/
        //上面这种方式在集合元素小于10时结束死循环的时候，取不到各自线程最后的count值，先把两个线程对象拿出来
        SendThread xiaoming = new SendThread(gift,"小明");
        xiaoming.start();
        SendThread xiaohong = new SendThread(gift,"小红");
        xiaohong.start();

        //担心执行getCount方法的时候，上面两个线程还没有执行完，所以用join方法
        //我的疑惑：比如xiaoming.join();执行的时候，不是会让xiaohong线程一直等待吗，还会执行吗？输出结果一直都是小明线程在前面且最多个
        //而且磊哥这种方法执行第三次之后，只有小明发出91份礼物，一直都是，不行。
        //弹幕：有BUG吧，先调用了xm.join()导致小明的线程优先级提上去了，导致主线程再调用xh.join()时小明线程可能已经执行很多次了吧
        //有弹幕说：小红抢不到的，给counter++下面加个休眠一毫秒就可以了。我尝试了，确实增加时间，让其他线程有时间抢占gift和count资源
        xiaoming.join();    //有异常直接抛出
        xiaohong.join();
        System.out.println("小明发送的礼物数量为： "+xiaoming.getCount());
        System.out.println("小红发送的礼物数量为： "+xiaohong.getCount());

    }
}
